package com.jdkreader.io;

import java.io.*;
import java.util.Arrays;

public class ByteArrayExample {

   // 自定义常数5
    public static final int LEN=5;
    // 对应英文字母“abcddefghijklmnopqrsttuvwxyz”
    private static final byte[] ArrayLetters = {
            0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6A, 0x6B, 0x6C, 0x6D, 0x6E, 0x6F,
            0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, 0x7A
    };

    public static void main(String[] args) throws IOException {
        String tmp = new String(ArrayLetters);
        System.out.println("ArrayLetters="+tmp);

        //tesByteArrayInputStream() ;

        testByteArrayOutputStream();
    }

    /**
     * 测试ByteArrayOutPutStream
     */
    public static void testByteArrayOutputStream() throws IOException {

        ByteArrayOutputStream baos=new ByteArrayOutputStream();

        //向字节数组输出流写入字节数组
        baos.write(ArrayLetters,0,LEN);
        System.out.println("写入ArrayLetters数组的五个元素后后，字节数组输入流为："+baos.toString("utf-8"));
        //向字节数组写入f对应的int
        baos.write(0x66);
        System.out.println("写入f后，字节数组输入流为："+baos.toString("utf-8"));
        //获得字节数组的长度
        System.out.println("字节数组的长度是： "+baos.size());
        //将字节流数组转换成数组
        byte[] b=baos.toByteArray();
        System.out.println("字节流转换成的数组： "+new String(b));

        // 将baos写入到另一个输出流中
        try {
            ByteArrayOutputStream baos2 = new ByteArrayOutputStream();
            baos.writeTo((OutputStream)baos2);
            System.out.printf("baos2=%s\n", baos2);
        } catch (IOException e) {
            e.printStackTrace();
        }

        baos.flush();
        baos.close();
    }

    /**
     * 测试ByteArrayInputStream
     */
    public static void tesByteArrayInputStream() throws IOException {
        ByteArrayInputStream bais=new ByteArrayInputStream(ArrayLetters);

        //读取下个字节
        int data=bais.read();
        System.out.println("当前字节为："+ (char)data);

        //写入数据到数组b,写入起始位置为off，长度为len，从字节流下一字节开始写入
        byte b[]=new byte[LEN];
        bais.read(b,0,LEN);
        String tempb=new String(b);
        System.out.println("写入后的数组是"+tempb);

        //写入数组后，中间的元素已经被跳过了
        data=bais.read();
        System.out.println("当前字节为："+ (char)data);

        //跳过两个字节
        long skipNum=bais.skip(2);
        data=bais.read();
        System.out.println("跳过的字节数是： "+skipNum+",当前字节是: "+ (char)data);
        //字节流可用字节数
        System.out.println("字节流可用字节数为： "+bais.available());
        //当前字节流是否支持mark/reset功能
        System.out.println("当前字节流是否支持mark/reset功能： "+bais.markSupported());
        //将当前pos作为mark
        bais.mark(0);
        data=bais.read();
        System.out.println("标记位置的字节是： "+ (char)data);
       //跳过LEN个字节，再reset到上次mark的位置
        bais.skip(LEN);
        bais.reset();
        data=bais.read();
        System.out.println("重置后的字节是： "+ (char)data);

        bais.close();

    }
}
